package cn.bugstack.springframework.beans.factory.config;

import cn.bugstack.springframework.beans.PropertyValues;

/**
 *
 *
 *
 * 作者：DerekYRC https://github.com/DerekYRC/mini-spring
 * @description 定义 Bean 实例信息
 * @date 2022/03/07
 *
 *
 */
/**
 * BeanDefinition 类用于描述一个 Spring Bean 的定义。
 * 它包含了一个 Bean 的类类型以及该 Bean 的属性值。
 */
public class BeanDefinition {

    private Class beanClass; // Bean 的类类型

    private PropertyValues propertyValues; // Bean 的属性值集合

    private String initMethodName;

    private String destroyMethodName;

    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;

    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

    private String scope = SCOPE_SINGLETON;

    private boolean singleton = true;

    private boolean prototype = false;

    public void setScope(String scope) {
        this.scope = scope;
        this.singleton = SCOPE_SINGLETON.equals(scope);
        this.prototype = SCOPE_PROTOTYPE.equals(scope);
    }

    public boolean isSingleton() {
        return singleton;
    }

    public boolean isPrototype() {
        return prototype;
    }


    /**
     * 构造函数，初始化一个 BeanDefinition 实例。
     * @param beanClass Bean 的类类型。
     */
    public BeanDefinition(Class beanClass) {
        this.beanClass = beanClass;
        this.propertyValues = new PropertyValues(); // 初始化属性值为一个空的 PropertyValues 实例
    }

    /**
     * 构造函数，初始化一个带有特定属性值的 BeanDefinition 实例。
     * @param beanClass Bean 的类类型。
     * @param propertyValues Bean 的属性值集合。
     */
    public BeanDefinition(Class beanClass, PropertyValues propertyValues) {
        this.beanClass = beanClass;
        this.propertyValues = propertyValues != null ? propertyValues : new PropertyValues(); // 如果传入的属性值非空，则使用它，否则初始化一个空的 PropertyValues 实例
    }

    /**
     * 获取 Bean 的类类型。
     * @return 返回 Bean 的类类型。
     */
    public Class getBeanClass() {
        return beanClass;
    }

    /**
     * 设置 Bean 的类类型。
     * @param beanClass 想要设置的 Bean 的类类型。
     */
    public void setBeanClass(Class beanClass) {
        this.beanClass = beanClass;
    }

    /**
     * 获取 Bean 的属性值集合。
     * @return 返回 Bean 的属性值集合。
     */
    public PropertyValues getPropertyValues() {
        return propertyValues;
    }

    /**
     * 设置 Bean 的属性值集合。
     * @param propertyValues 想要设置的 Bean 的属性值集合。
     */
    public void setPropertyValues(PropertyValues propertyValues) {
        this.propertyValues = propertyValues;
    }

    public String getInitMethodName() {
        return initMethodName;
    }

    public void setInitMethodName(String initMethodName) {
        this.initMethodName = initMethodName;
    }

    public String getDestroyMethodName() {
        return destroyMethodName;
    }

    public void setDestroyMethodName(String destroyMethodName) {
        this.destroyMethodName = destroyMethodName;
    }
}

